// errors 包在`pkg/errors`包的基础上修改，增加了错误码包装和其它特性。
// TODO ：订正关键特性
//
// Go 中的传统错误处理方法如下：
//
//	if err != nil {
//	        return err
//	}
//
// 在嵌套调用中，最终返回的错误不包含上下文和调试信息，也就是虽然最终会得到一个
// 错误，但是不知道它的传递路径和原因，示例参见`example/traditional`。 errors 包
// 提供了为原始错误添加上下文的方法，不会破坏原始错误。
//
// # 为错误添加上下文
//
// 在调用 errors.Wrap 函数时返回一个包装后的新错误，新错误为原始错误附加了调用栈
// 和信息作为上下文。例如：
//
//	func e2() error {
//		err := e1()
//		if err != nil {
//			return errors.Wrap(err, "e2 dose not handle")
//		}
//		return nil
//	}
//
// 示例参见`example/wrap`。
//
// 如果需要额外的控制， errors.WithStack 和 errors.WithMessage 函数分别为原始错
// 误附加调用栈和信息，它们是 errors.Wrap 函数的解构。
//
// # 检索错误原因
//
// errors.Wrap 函数为原始错误添加了一层包装，如果错误实现了以下接口：
//
//	type causer interface {
//	        Cause() error
//	}
//
// 就可以通过 errors.Cause 函数以递归的方式从错误树中找到最初的、未实现 causer
// 接口的错误作为原始错误。例如通过 type switch 处理指定类型的错误：
//
//	switch err := errors.Cause(err).(type) {
//	case *MyError:
//	        // handle specifically
//	default:
//	        // unknown error
//	}
//
// causer 接口并未从包中导出。
//
// # 以指定格式打印错误
//
// errors 包返回的所有错误均实现了 fmt.Formatter 接口，可以使用 fmt 包格式化打印，
// 支持以下动词：
//
//	%s    打印错误，如果错误实现了 causer 接口，将递归打印。
//	%v    同 %s 。
//	%+v   扩展格式，打印错误栈的每个栈帧，从栈顶开始打印。
//
// 示例参见`example/wrap`。
package errors // import "gitee.com/baihr/iam/pkg/errors"
